package com.cje.repository;

import com.cje.pojo.Item;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @Auther: ChenJinEn
 * @Date: 2020/4/17 08:09
 * @Description: //TODO
 */
@Component
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    /**
     Spring Data 的另一个强大功能，是根据方法名称自动实现功能。
     比如：你的方法名叫做：findByTitle，那么它就知道你是根据title查询，然后自动帮你完成，无需写实现类。
     当然，方法名称要符合一定的约定：
     Keyword            	Sample                                  	Elasticsearch Query String
     And                	findByNameAndPrice                      	{"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
     Or                 	findByNameOrPrice                       	{"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
     Is                 	findByName                              	{"bool" : {"must" : {"field" : {"name" : "?"}}}}
     Not                	findByNameNot                           	{"bool" : {"must_not" : {"field" : {"name" : "?"}}}}
     Between            	findByPriceBetween                      	{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
     LessThanEqual      	findByPriceLessThan                     	{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
     GreaterThanEqual   	findByPriceGreaterThan                  	{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
     Before             	findByPriceBefore                       	{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
     After              	findByPriceAfter                        	{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
     Like               	findByNameLike                          	{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
     StartingWith       	findByNameStartingWith                  	{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
     EndingWith         	findByNameEndingWith                    	{"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}}
     Contains/Containing	findByNameContaining                    	{"bool" : {"must" : {"field" : {"name" : {"query" : "**?**","analyze_wildcard" : true}}}}}
     In                 	findByNameIn(Collection<String>names)   	{"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}}
     NotIn              	findByNameNotIn(Collection<String>names)	{"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}}
     Near               	findByStoreNear                         	Not Supported Yet !
     True               	findByAvailableTrue                     	{"bool" : {"must" : {"field" : {"available" : true}}}}
     False              	findByAvailableFalse                    	{"bool" : {"must" : {"field" : {"available" : false}}}}
     OrderBy            	findByAvailableTrueOrderByNameDesc      	{"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}}
     例如，我们来按照价格区间查询，定义这样的一个方法：
     不需要写实现类，然后我们直接去测试运行：
     */

    /**
     * 根据价格区间查询
     * @param price1
     * @param price2
     * @return
     */
    List<Item> findByPriceBetween(double price1, double price2);
}
